diff options
Diffstat (limited to 'pages/en/anime/watch/[...info].js')
| -rw-r--r-- | pages/en/anime/watch/[...info].js | 240 |
1 files changed, 127 insertions, 113 deletions
diff --git a/pages/en/anime/watch/[...info].js b/pages/en/anime/watch/[...info].js index c17d9c5..aa0b672 100644 --- a/pages/en/anime/watch/[...info].js +++ b/pages/en/anime/watch/[...info].js @@ -4,156 +4,90 @@ import { useEffect, useState } from "react"; import { getServerSession } from "next-auth/next"; import { authOptions } from "../../../api/auth/[...nextauth]"; -import dotenv from "dotenv"; import Navigasi from "../../../../components/home/staticNav"; import PrimarySide from "../../../../components/anime/watch/primarySide"; import SecondarySide from "../../../../components/anime/watch/secondarySide"; -import { GET_MEDIA_USER } from "../../../../queries"; import { createList, createUser, getEpisode } from "../../../../prisma/user"; -// import { updateUser } from "../../../../prisma/user"; export default function Info({ sessions, - aniId, watchId, provider, epiNumber, dub, + info, userData, proxy, disqus, }) { - const [info, setInfo] = useState(null); const [currentEpisode, setCurrentEpisode] = useState(null); const [loading, setLoading] = useState(false); - const [progress, setProgress] = useState(0); - const [statuses, setStatuses] = useState("CURRENT"); const [artStorage, setArtStorage] = useState(null); const [episodesList, setepisodesList] = useState(); + const [mapProviders, setMapProviders] = useState(null); + const [onList, setOnList] = useState(false); + const [origin, setOrigin] = useState(null); useEffect(() => { setLoading(true); + setOrigin(window.location.origin); async function getInfo() { - const ress = await fetch(`https://graphql.anilist.co`, { - method: "POST", - headers: { - "Content-Type": "application/json", - }, - body: JSON.stringify({ - query: `query ($id: Int) { - Media (id: $id) { - id - idMal - title { - romaji - english - native - } - status - genres - episodes - studios { - edges { - node { - id - name - } - } - } - bannerImage - description - coverImage { - extraLarge - color - } - synonyms - - } - } - `, - variables: { - id: aniId, - }, - }), - }); - const data = await ress.json(); - - if (sessions?.user?.name) { - const response = await fetch("https://graphql.anilist.co/", { - method: "POST", - headers: { - "Content-Type": "application/json", - }, - body: JSON.stringify({ - query: GET_MEDIA_USER, - variables: { - username: sessions?.user?.name, - }, - }), - }); - - const responseData = await response.json(); - - const prog = responseData?.data?.MediaListCollection; - - if (prog && prog.lists.length > 0) { - const gut = prog.lists - .flatMap((item) => item.entries) - .find((item) => item.mediaId === parseInt(aniId)); + if (info.mediaListEntry) { + setOnList(true); + } - if (gut) { - setProgress(gut.progress); - setOnList(true); - } + const response = await fetch( + `/api/v2/episode/${info.id}?releasing=${ + info.status === "RELEASING" ? "true" : "false" + }${dub ? "&dub=true" : ""}` + ).then((res) => res.json()); + const getMap = response.find((i) => i?.map === true) || response[0]; + let episodes = response; - if (gut?.status === "COMPLETED") { - setStatuses("REPEATING"); - } else if ( - gut?.status === "REPEATING" && - gut?.media?.episodes === parseInt(epiNumber) - ) { - setStatuses("COMPLETED"); - } else if (gut?.status === "REPEATING") { - setStatuses("REPEATING"); - } else if (gut?.media?.episodes === parseInt(epiNumber)) { - setStatuses("COMPLETED"); - } else if ( - gut?.media?.episodes !== null && - data?.data?.Media.episodes === parseInt(epiNumber) - ) { - setStatuses("COMPLETED"); - setLoading(false); - } + if (getMap) { + if (provider === "gogoanime" && !watchId.startsWith("/")) { + episodes = episodes.filter((i) => { + if (i?.providerId === "gogoanime" && i?.map !== true) { + return null; + } + return i; + }); } - } - - setInfo(data.data.Media); - const response = await fetch( - `/api/consumet/episode/${aniId}${dub ? `?dub=${dub}` : ""}` - ); - const episodes = await response.json(); + setMapProviders(getMap?.episodes); + } if (episodes) { - const getProvider = episodes.data?.find( - (i) => i.providerId === provider + const getProvider = episodes?.find((i) => i.providerId === provider); + const episodeList = dub + ? getProvider?.episodes?.filter((x) => x.hasDub === true) + : getProvider?.episodes.slice(0, getMap?.episodes.length); + const playingData = getMap?.episodes.find( + (i) => i.number === Number(epiNumber) ); + if (getProvider) { - setepisodesList(getProvider.episodes); - const currentEpisode = getProvider.episodes?.find( + setepisodesList(episodeList); + const currentEpisode = episodeList?.find( (i) => i.number === parseInt(epiNumber) ); - const nextEpisode = getProvider.episodes?.find( + const nextEpisode = episodeList?.find( (i) => i.number === parseInt(epiNumber) + 1 ); - const previousEpisode = getProvider.episodes?.find( + const previousEpisode = episodeList?.find( (i) => i.number === parseInt(epiNumber) - 1 ); setCurrentEpisode({ prev: previousEpisode, - playing: currentEpisode, + playing: { + id: currentEpisode.id, + title: playingData?.title, + description: playingData?.description, + image: playingData?.image, + number: currentEpisode.number, + }, next: nextEpisode, }); } else { @@ -176,6 +110,36 @@ export default function Info({ <> <Head> <title>{info?.title?.romaji || "Retrieving data..."}</title> + <meta + name="title" + data-title-romaji={info?.title?.romaji} + data-title-english={info?.title?.english} + data-title-native={info?.title?.native} + /> + <meta + name="description" + content={currentEpisode?.playing?.description || info?.description} + /> + <meta name="twitter:card" content="summary_large_image" /> + <meta + name="twitter:title" + content={`Episode ${epiNumber} - ${ + info.title.romaji || info.title.english + }`} + /> + <meta + name="twitter:description" + content={`${ + currentEpisode?.playing?.description?.slice(0, 180) || + info?.description?.slice(0, 180) + }...`} + /> + <meta + name="twitter:image" + content={`${origin}/api/og?title=${ + info.title.romaji || info.title.english + }&image=${info.bannerImage || info.coverImage.extraLarge}`} + /> </Head> <Navigasi /> @@ -189,7 +153,6 @@ export default function Info({ epiNumber={epiNumber} providerId={provider} watchId={watchId} - status={statuses} onList={onList} proxy={proxy} disqus={disqus} @@ -201,10 +164,10 @@ export default function Info({ /> <SecondarySide info={info} + map={mapProviders} providerId={provider} watchId={watchId} episode={episodesList} - progress={progress} artStorage={artStorage} dub={dub} /> @@ -215,9 +178,8 @@ export default function Info({ } export async function getServerSideProps(context) { - dotenv.config(); - const session = await getServerSession(context.req, context.res, authOptions); + const accessToken = session?.user?.token || null; const query = context.query; if (!query) { @@ -236,6 +198,57 @@ export async function getServerSideProps(context) { let userData = null; + const ress = await fetch(`https://graphql.anilist.co`, { + method: "POST", + headers: { + "Content-Type": "application/json", + ...(accessToken && { Authorization: `Bearer ${accessToken}` }), + }, + body: JSON.stringify({ + query: `query ($id: Int) { + Media (id: $id) { + mediaListEntry { + progress + status + customLists + repeat + } + id + idMal + title { + romaji + english + native + } + status + genres + episodes + studios { + edges { + node { + id + name + } + } + } + bannerImage + description + coverImage { + extraLarge + color + } + synonyms + + } + } + `, + variables: { + id: aniId, + }, + }), + }); + const data = await ress.json(); + try { if (session) { await createUser(session.user.name); @@ -264,6 +277,7 @@ export async function getServerSideProps(context) { epiNumber: epiNumber || null, dub: dub || null, userData: userData?.[0] || null, + info: data.data.Media || null, proxy, disqus, }, |